CNC-Beispiel 02: Online dekodieren mit Verwendung von Variablen
Sehen Sie hierzu das Beispielprojekt CNC02_online.project
im Installationsverzeichnis von CODESYS unter ..\CODESYS SoftMotion\Examples
.
Das Beispiel zeigt, wie ein CNC-Programm unter Verwendung von Variablen dekodiert werden kann.
NC-Programm im CNC-Editor erstellen
Erstellen Sie ein Programm
CNCOnline
mit einer SoftMotion-Steuerung.Legen Sie eine globale Variablenliste an und deklarieren Sie darin zwei Variablen.
VAR_GLOBAL g_x: REAL:=100; g_y:REAL:=50; END_VAR
Fügen Sie ein Object CNC-Programm mit dem Namen
Example
ein.Wählen Sie dabei die Implementierung
Din66025
und den ÜbersetzungsmodusSMC_CNC_REF
. Dieser Modus ist notwendig, da Sie in Ihrem Programm Variablen verwenden.Geben Sie folgende Bewegungssätze ein:
CNC-Editor:
Drive Interface, Steuerungskonfiguration erstellen
Definieren Sie eine Antriebsstruktur wie im Beispiel CNCdirect
.
IEC-Programm erstellen
Fügen Sie eine POU (CFC) mit dem Namen
Path
zur Applikation hinzu.Im Programm
Path
finden die Decodierung des NC-Programms zur OUTQUEUE und die Geschwindigkeitsüberprüfung statt.Der Aufruf von
SMC_CheckVelocities
ist obligatorisch.CFC:
Fügen Sie eine POU (CFC) mit dem Namen
Ipo
zur Applikation hinzu.Dieses Programm ist fast identisch mit dem Programm des Beispiels
CNCdirect
. Der Dateneingang des Interpolators entspricht jedoch nicht CNC-Programmnamen (ADR(Example)
), sondern dem OutQueue-Ausgang der bahnvorverarbeitenden Bausteine (checkVel.poqDataOut
).
Task für die Bahnvorverarbeitung anlegen
Da Sie den Übersetzungsmodus SMC_CNC_REF
gewählt haben, müssen Sie das Decodieren und Bahnvorverarbeiten im IEC-Programm durchführen. Diese Berechnung ist zeitintensiv. Sie muss nicht im Interpolatortakt ausgeführt werden, da pro Decoder-Aufruf ein Wegobjekt erzeugt wird, das typischerweise für viele Interpolatoraufrufe verwendet wird. Sie sollten den Vorgang in eine Task mit niedrigerer Priorität und selteneren Aufrufen auslagern.
Legen Sie eine Task
PathTask
an.Legen Sie folgende Parameter fest:
Priorität: 10
Intervall: T#30ms
Fügen Sie die POU
Path
zur Task hinzu.

In der langsamen Task wird anfänglich pro Zyklus etwa ein GEOINFO-Objekt erzeugt, das in der OUTQUEUE-Struktur des Decoder-Bausteins gespeichert ist. Ist diese OUTQUEUE voll, pausieren die Bausteine der langsamen Task solange, bis die OUTQUEUE nicht mehr voll ist. Dies ist der Fall, sobald die schnelle Task das erste GEOINFO-Objekt abgearbeitet hat und dieses aus der OUTQUEUE löscht.
Dann werden die Bausteine der langsamen Task wieder aktiv und befüllen die OUTQUEUE-Struktur.
In der schnellen Task wird pro Zyklus ein Bahnpunkt aus der OUTQUEUE-Struktur, auf die der Eingang
DataIn
des Interpolators zeigt, berechnet und verarbeitet. Da ein GEOINFO-Objekt in der Regel aus mehreren Bahnpunkten besteht, dauert es einige Zyklen bis das erste GEOINFO-Objekt abgearbeitet ist und vom Interpolator automatisch gelöscht wird.Da das Abarbeiten eines GEOINFO-Objekts im Gegensatz zum Erstellen mehrerer Zyklen dauert, kann die langsame Task seltener aufgerufen werden als die schnelle.
Die Taskzeiten müssen jedoch so gewählt werden, dass in der letzten OUTQUEUE der langsamen Task immer genügend GEOINFO-Objekte gelagert sind, so dass kein Data-Underrun auftritt. Dies tritt auf, wenn dem Interpolator aus DataIn keine GEOINFO-Objekte mehr zur Verfügung stehen, und das Bahnende noch nicht erreicht ist. In diesem Fall bremst der Interpolator und bleibt so lange stehen, bis wieder neue Datenelemente verfügbar sind.
Bedien- und Testoberfläche erstellen
Die Visualisierung entspricht dem Beispiel CNCdirect.project
. Fügen Sie zusätzlich Templates der neuen Bausteine (SMC_NCDecoder
und SMC_CheckVelocities
) hinzu. Legen Sie auch für die globalen Variablen g_x
und g_y
eine Anzeige an, damit Sie deren Funktion später bei der Inbetriebnahme überprüfen können.
Inbetriebnahme
Übersetzen Sie das erstellte Programm und starten sie es. Das Programm führt die CNC-Bewegung aus, sobald der Eingang Execute
des Decoders und des Interpolators gesetzt wurde. Wenn Sie die Werte der globalen Variablen ändern, werden diese bei einem Neustart des Decoders übernommen und die Bahn passt sich entsprechend an. Beobachten Sie auch die Funktion des Eingangs Append
des Decoders.